package com.kfm.jdbc.day01;

import java.sql.*;
import java.util.List;

/**
 * 数据库工具类
 * <p>
 * 提供获取连接的方法
 * CRUD 方法
 */
public class DBUtil<T> {

    // 数据库连接信息
    private String url;
    private String user;

    private String pass;

    // 数据库连接
    private Connection conn;

    private PreparedStatement ps;

    private ResultSet resultSet;

    static {
        // 注册驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    public DBUtil(String url, String user, String pass) {
        this.url = url;
        this.user = user;
        this.pass = pass;
    }

    /**
     * 获取数据库连接
     *
     * @return
     */
    public Connection getConnection() {
        if (conn == null) {
            try {
                conn = DriverManager.getConnection(url, user, pass);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        return conn;
    }

    /**
     * 关闭数据库连接
     */
    public void close() {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
            conn = null;
        }
    }


    /**
     * 查询一条数据
     *
     * @param sql
     * @param params
     * @return
     */
    public T selectOne(String sql, Object... params) {
        return null;
    }

    /**
     * 查询多条数据
     *
     * @param sql
     * @param params
     * @return
     */
    public List<T> selectList(String sql, Object... params) {
        return null;
    }

    /**
     * 新增、修改、删除操作
     * insert / update / delete
     *
     * @param sql
     * @param params
     * @return
     */
    public int update(String sql, Object... params) throws SQLException {
        return update(sql, Statement.NO_GENERATED_KEYS, params);
    }

    public int delete(String sql, Object... params) throws SQLException {
        return update(sql, Statement.NO_GENERATED_KEYS, params);
    }

    /**
     * 新增并返回自增长列的值
     *
     * @param sql
     * @param params
     * @return
     */
    public int insert(String sql, Object... params) throws SQLException {
        update(sql, Statement.RETURN_GENERATED_KEYS, params);

        // 获取结果集
        resultSet = ps.getGeneratedKeys();

        return resultSet.next() ? resultSet.getInt(1) : -1;
    }


    /**
     * 执行数据的修改操作
     * insert  update  delete
     *
     * @param sql               执行的SQL
     * @param autoGeneratedKeys 是否需要返回自增长列，1表示需要。方法调用完毕后可以 PreparedStatement::getGeneratedKeys()获取自增长列的值
     * @param params            sql 的参数
     * @return 影响行数
     * @throws SQLException
     */
    private int update(String sql, int autoGeneratedKeys, Object... params) throws SQLException {
        // 获取连接
        getConnection();
        // 获取 PreparedStatement 对象
        ps = conn.prepareStatement(sql, autoGeneratedKeys);

        // 设置参数
        setParams(params);

        // 执行 sql
        return ps.executeUpdate();
    }


    private void setParams(Object... params) throws SQLException {
        if (params != null){
            // 设置参数
            for (int i = 0; i < params.length; i++) {
                ps.setObject(i + 1, params[i]);
            }
        }
    }


}
